home *** CD-ROM | disk | FTP | other *** search
- {
- |> I need a Text scroller for a message (greater than 255 chars??) .. I have one
- |> that works right now..but I use the getintvec and setintvec with $8 which is
- |> a programmable timer i think..but im afraid that it is slowing down my
- |> computer clock, and its not consistent in its speed..I also need to be doing
- |> other things (scrolling through options with arrow keys) while the scrolling
- |> is going on..
-
- There are a number of ways to go about your problem. But it depends
- on whether you'd like the scrolling to be consistent in its speed or
- you don't like to slow down your system by hooking Int 08h or 1Ch.
- For a more consistent loop, you would have to use the timer int (08h
- or 1Ch). Or if you could call an "update" routine very often, then
- you could do away with the timer int. If the refresh rate is
- relatively slow, you could still use either method - just make sure
- that your update routine is somewhat fast.
-
- Anyway, I'll let you decide on which technique to use on providing the
- refresh calls. If you need some more help, just drop me a line.
- Below is a sample code that you could probably use for the update:
- }
-
- Uses Crt;
-
- Var CurrIndex : Word; { current starting position of string }
- ScreenLoc : Pointer; { location of scroll bar in video memory }
- ScrollSize : Word; { size of scroll bar (in columns) }
-
- Procedure Setup(Col, Row, ScrollSize : Word; Var ScreenLoc : Pointer);
- Var Seg1, Ofs1 : Word;
- Begin
- { we're assuming an 80 column text mode }
- Ofs1 := (Row-1)*160 + ((Col-1)*2);
-
- { determine whether it's mono or colored }
- If (Mem[$40:$49] = 7) then Seg1 := $B000
- else Seg1 := $B800;
-
- ScreenLoc := Ptr(Seg1,Ofs1); { I'm not sure about the syntax }
- { better check the online help }
- End;
-
-
- Procedure Update;Assembler;
- ASM
- CLD
- LES DI, ScreenLoc { ES:DI is where the scroll bar is in memory }
- MOV CX, ScrollSize
-
- MOV SI, CurrIndex
- OR SI, SI { is it our first time to display the string? }
- JZ @WriteString
-
- DEC CX
- @ShiftLeft: { let's shift the chars one position to the }
- MOV AL, ES:[DI+2] { left... ( we don't care about the attr) }
- STOSB
- INC DI { skip the attribute position }
- LOOP @ShiftLeft { continue up until the end of scroll bar }
-
- MOV AL, CS:[SI] { see what's the next char to append... }
- OR AL, AL { are we at the end of the string ? }
- JNZ @NotEndOfStr { if not, just proceed. }
- MOV SI, Offset @Message { otherwise, point back to the first char }
- MOV AL, CS:[SI] { and get it }
- @NotEndOfStr:
- STOSB { put new char at tail of scroll bar }
-
- INC SI { adjust index -- so that we know what's the }
- JMP @SaveIndex { next char to append next time... }
-
- @WriteString: { routine to display message the first time }
- MOV SI, Offset @Message
- @NextChar:
- MOV AL, CS:[SI]
- OR AL, AL
- JZ @WriteString { if message is shorter than scroll, restart }
- STOSB { put char in video memory }
- INC DI { skip the attribute part }
- INC SI { adjust SI to point to next char in message }
- LOOP @NextChar { fill-up all of scrollbar }
-
- @SaveIndex:
- MOV CurrIndex, SI { Save index. We need it again later }
- JMP @Exit
-
- @Message:
- DB 'This is a sample message...' { put your text message here }
- DB 0 { terminate it with NULL }
- @Exit:
- End;
-
- Var Fedup : Boolean;
-
- Begin
- ScrollSize := 40; { adjust to your liking }
-
- { scroll bar at first row, 20th column }
- Setup(20,1,SCrollSize,ScreenLoc);
-
- CurrIndex := 0; { initialize index }
-
- { sample code to test... I hope it works :-) }
- ClrScr;
- Repeat
- Update;
- Delay(100); { must put some delay or something }
- { otherwise, you won't be able to read }
- { message... unless you're superman :-) }
- { do some other stuffs }
-
- Fedup := (KeyPressed) and (ReadKey = #27);
- Until (Fedup);
- End.
-
- Note that the example about is not fully tested. Most of my post here
- are made from scratch so I don't know if it would fit your needs.
-
- Also, sorry for the term "scroll bar". I know it means something else
- but I can't think of something short but appropiate term.
-
- Like I said, you have to judge whether to use a timer int or not. But
- if you could put the update routine in a loop that it gets to be executed in
- regular intervals, that would be enough.
-
- Happy programming...
-
- YO!
- ydeeps
- --
- Erwin D. Paguio
- http://rh.iist.unu.edu/~ep/ydeeps.html
- Pascal and ASM Enthusiast